Source: models/ego-query-model.js

/**
 * @auther Yuxin Ma
 * @module models/ego-query-model
 * @exports EgoQueryModel
 */

'use strict';
var $ = require('jquery');
var _ = require('underscore');
var Backbone = require('backbone');
Backbone.$ = $;
//require('backbone-relational');

var Node = require('./node-model');
var NodeCollection = require('../collections/node-collection');
var Filter = require('./query-filter');
var FilterCollection = require('../collections/filter-collection');
var Graph = require('./graph-model');

var EgoQueryModel = Backbone.Model.extend( /** @lends models/EgoQueryModel.prototype */ {
    /**
     * Ego网络的查询。
     * @augments Backbone.Model
     * @constructs
     */

    urlRoot: 'query/ego',

    defaults: {
        /**
         * 查询层数,默认为3。
         * @type {number}
         */
        layer: 3,

        /**
         * 根节点id的数组。一般在查询Ego网络时只需要填充1个元素。
         * @type {number[]}
         */
        vertexIds: [],
        edgeCondition: 'and',

        /**
         * 边的过滤器
         * @type {Filter}
         */
        edgeFilters: new FilterCollection(),
        vertexCondition: 'and',

        /**
         * 节点的过滤器
         * @type {Filter}
         */
        vertexFilters: new FilterCollection(),
        edgeLabels: [],
        vertexLabels: [],
        direction: 'both'
    },

    ///***************************************************************************************************
    // * 测试用,用于匹配Graph(EGO_DEMO)的纯前端demo数据。
    // * TODO: 完成后端后删除
    // ***************************************************************************************************/
    //save: function(data, options) {
    //    // 创建EGO_DEMO Graph
    //    var g = new Graph({DEBUG_EGO_FRONTEND: true, diameter: 1000}, {parse: true})
    //
    //    this.set('graph', new Graph());
    //},

    //validate: function(attrs, options) {
    //    // TODO: 此处仅适用于2015.12.13的demo数据,后端可灵活变化后删除。
    //    if (attrs['demoMagicNum'] === undefined) {
    //        return '2015.12.13 Currently the demoMagicNum is necessary.';
    //    }
    //},


    /**
     * 添加节点
     * @param {(number|Node)} v - 节点id或Node
     */
    addVertex: function(v) {
        if (v instanceof Node) {
            v = v.id;
        }

        if (this.get('vertexIds').indexOf(v) == -1) {
            this.get('vertexIds').push(v);
        }
    },

    /**
     * 删除节点
     * @param {(number|Node)} v - 节点id或Node
     */
    removeVertex: function(v) {
        if (v instanceof Node) {
            v = v.get('id');
        }

        var vertices = this.get('vertexIds');
        var index = vertices.indexOf(v);
        if (index > -1) {
            vertices.splice(index, 1);
        }
    },

    /**
     * 添加边的过滤条件
     * @param {Filter} edgeFilter - 过滤器
     */
    addEdgeFilter: function(edgeFilter) {
        this.get('edgeFilters').add(edgeFilter);
    },

    /**
     * 添加节点的过滤条件
     * @param {Filter} vertexFilter - 过滤器
     */
    addVertexFilter: function(vertexFilter) {
        this.get('vertexFilters').add(vertexFilter);
    },

    /**
     * 来自https://github.com/jashkenas/backbone/issues/483的最后一段,解决嵌套Model和Collection的toJSON问题。
     * @returns {*}
     */
    toJSON: function() {
        if (this._isSerializing) {
            return this.id || this.cid;
        }
        this._isSerializing = true;
        var json = _.clone(this.attributes);
        _.each(json, function(value, name) {
            _.isFunction((value || "").toJSON) && (json[name] = value.toJSON());
        });
        this._isSerializing = false;
        return json;
    },

    /**
     * 重载Backbone.Model.parse。
     * @param {*} response
     * @param {*} options
     * @returns {{}}
     */
    parse: function(response, options) {
        console.log(response);
        console.log(options);

        //return {test: 'ok'};
    }
});

module.exports = EgoQueryModel;